package middleware.p2p;

import java.io.Serializable;

import middleware.p2p.log.VectorClock;

/**	
 * 	Classe che fornisce un'astrazione per i messaggi scambiati all'intero del middleware.
 * 	Ogni messaggio contiene un task descriptor ed il vector clock necessario per gli algoritmi di ordinamento.
 * 	@see TaskDescriptor
 */
public class MiddlewareMessage implements Serializable{
	/**
	 * 	Campo necessario alla serializzazione
	 */
	private static final long serialVersionUID = -1910578396328015654L;
	/**
	 * 	Proprieta' statica contenente il prossimo id del messaggio generato con il metodo {@link MiddlewareMessage#createEmptyMessage(int[], TaskDescriptor)}
	 */
	private static int progId=1;
	/**
	 * 	Id del messaggio.
	 */
	private int id;
	/**
	 * 	Vector clock per log trasportato dal messaggio.
	 */
	private VectorClock logVclock;
	/**
	 * 	Vector clock per monitor trasportato dal messaggio.
	 */
	private VectorClock monitorVclock;
	/**
	 * 	TaskDescriptor rappresentante il contenuto del messaggio
	 */
	private TaskDescriptor payload;
	/**
	 * 	Costruttore principale della classe. 
	 * 	@param id		Id del messaggio
	 * 	@param vclock	Vector Clock del messaggio
	 * 	@param payload	Corpo del messaggio
	 */
	private MiddlewareMessage(int id,VectorClock logVclock,VectorClock monitorVclock,TaskDescriptor payload) {
		this.id=id;
		this.payload=payload;
		this.logVclock=logVclock;
		this.monitorVclock=monitorVclock;
	}	
	/**
	 * 	Metodo per ottenere il payload del messaggio
	 * 	@return Il payload del messaggio
	 */
	public TaskDescriptor getPayload() {
		return payload;
	}
	/**
	 * 	Metodo per impostare il Payload del messaggio ossia il TaskDescriptor da trasportare
	 * 	@param payload 	Il payload da impostare
	 */
	public void setPayload(TaskDescriptor payload) {
		this.payload = payload;
	}
	/**
	 * 	Metodo per ottenere l'id del messaggio.
	 * 	@return L'identificatore del messaggio.	
	 */
	public int getId() {
		return id;
	}
	/**
	 * 	Metodo per ottenere il vector clock trasportato dal massaggio.
	 * 	@return Il vector clock del messaggio
	 */
	public VectorClock getLogVclock() {
		return logVclock;
	}
	/**
	 * 	Metodo statico usato per generare un nuovo messaggio. 	
	 * 	@param logVclock		Il vector clock per i log del messaggio da generare
	 * 	@param monitorVclock	Il vector clock per il monitor del messaggio da generare
	 * 	@param payload			Il payload del messaggio da generare
	 * 	@return					Un messaggio corretto pronto per essere inviato.
	 */
	public static MiddlewareMessage createEmptyMessage(VectorClock logVclock,VectorClock monitorVclock,TaskDescriptor payload) {
		MiddlewareMessage msg=new MiddlewareMessage(progId, logVclock, monitorVclock, payload);
		progId++;
		return msg;
	}
	/**
	 * @return the monitorVclock
	 */
	public VectorClock getMonitorVclock() {
		return monitorVclock;
	}
	
}
